package cn.tedu.mall.order.service.impl;


import cn.tedu.mall.common.exception.CoolSharkServiceException;
import cn.tedu.mall.common.pojo.domain.CsmallAuthenticationInfo;
import cn.tedu.mall.common.restful.JsonPage;
import cn.tedu.mall.common.restful.ResponseCode;
import cn.tedu.mall.order.mapper.OmsCartMapper;
import cn.tedu.mall.order.service.IOmsCartService;
import cn.tedu.mall.pojo.order.dto.CartAddDTO;
import cn.tedu.mall.pojo.order.dto.CartUpdateDTO;
import cn.tedu.mall.pojo.order.model.OmsCart;
import cn.tedu.mall.pojo.order.vo.CartStandardVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class OmsCartServiceImpl implements IOmsCartService {

    @Autowired
    private OmsCartMapper omsCartMapper;

    @Override
    public void addCart(CartAddDTO cartDTO) {

        // 获取当前登录用户的userId
        Long userId = getUserId();
        // 判断这个userId的用户是否已经将指定的sku添加到购物车
        OmsCart omsCartExist = omsCartMapper.selectExistCart(userId, cartDTO.getSkuId());
        if (omsCartExist != null) {
            //如果sku已经存在于购物车,修改数量
            omsCartExist.setQuantity(omsCartExist.getQuantity()+cartDTO.getQuantity());
            // 执行数据库修改
            omsCartMapper.updateQuantityById(omsCartExist);
        }else {
            //如果sku不存在购物车,新增sku信息到购物车
            OmsCart omsCartNew = new OmsCart();
            //将cartDTO对象中的同名属性赋值给新创建的OmsCart对象
            BeanUtils.copyProperties(cartDTO,omsCartNew);
            // OmsCart赋值用户ID
            omsCartNew.setUserId(userId);
            //新增
            omsCartMapper.saveCart(omsCartNew);

        }

    }

    /**
     * 分页显示当前登录用户的购物车信息
     * @param page
     * @param pageSize
     * @return
     */
    @Override
    public JsonPage<CartStandardVO> listCarts(Integer page, Integer pageSize) {
        Long userId = getUserId();
        //查询前设置好你要查询的页面和每页的条数
        PageHelper.startPage(page,pageSize);
        List<CartStandardVO> list = omsCartMapper.selectCartsByUserId(userId);
        // 实例化PageInfo并转换为JsonPage返回给控制器
        return JsonPage.restPage(new PageInfo<>(list));
    }

    @Override
    public void removeCart(Long[] ids) {
        int i = omsCartMapper.deleteCartsByIds(ids);
        if (i==0) {
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"您的购物车没有对应商品");
        }
    }

    // 按用户id清空该用户购物车
    @Override
    public void removeAllCarts() {
        //获得用户id
        Long userId = getUserId();
        int rows = omsCartMapper.deleteCartsByUserId(userId);
        if (rows == 0){
            throw new CoolSharkServiceException(ResponseCode.NOT_FOUND,"您的购物车没有对应商品");
        }
    }

    //生成订单时,先删除购物车中的方法
    //过程中的零件,不需要控制层编写,被订单调用
    @Override
    public void removeUserCarts(OmsCart omsCart) {
        omsCartMapper.deleteCartByUserIdAndSkuId(omsCart);
    }

    //修改购物车商品数量
    @Override
    public void updateQuantity(CartUpdateDTO cartUpdateDTO) {
        OmsCart omsCart = new OmsCart();
        BeanUtils.copyProperties(cartUpdateDTO,omsCart);
        omsCartMapper.updateQuantityById(omsCart);
    }

    // 业务逻辑层中可能有多个方法需要获得当前用户信息
    // 我们可以定义一个方法实现从SpringSecurity中获得用户信息
    public CsmallAuthenticationInfo getUserInfo(){
        // 获得authenticationToken对象
        UsernamePasswordAuthenticationToken authenticationToken
                = (UsernamePasswordAuthenticationToken) SecurityContextHolder
                .getContext().getAuthentication();

        //判断获取的对象是不是空
        if (authenticationToken != null) {
            CsmallAuthenticationInfo csmallAuthenticationInfo = (CsmallAuthenticationInfo) authenticationToken.getCredentials();

        }

        throw new CoolSharkServiceException(ResponseCode.UNAUTHORIZED,"没有登录信息");

    }

    //单独获得当前登录用户的id
    public Long getUserId(){
        return getUserInfo().getId();
    }

}
